c++中delete和delete[]的区别

今天做了个改错题,跪在析构函数的delete上了。回来查了一下delete的具体用法,整理一下。
网上说 delete[] 是释放当初new的整个数组,而delete 释放的数组的第一个元素。写了个简单的程序测试了一下。

1
2
3
4
5
int *a = new int[10];
//delete[] a;
delete a;
return 0;

单步调试的时候我发现 1 运行delete a;那一行之后全部开的内存都被释放掉了。
查了好久,原来c++的delete是调用对象的析构函数来实现的。而基本的数据类型没有析构函数,在delete的时候直接全部释放掉了。
于是自己写了一个来测试一下,自定义数据类型是否满足。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
using namespace std;
class A{
public:
int *b;
A()
{
b = new int[10];
b[0] = 1;
}
~A()
{
delete[] b;
}
};
int main()
{
int *a = new int[10];
//delete[] a;
delete a;
cout<<a[1].b[0];
return 0;
}

我在自己定义的类A中定义了一个数组,然后在构造函数中给数组的第一个元素赋值。然后delete a;如果上述成立的话,那么应该只有 a[0]被释放了内存,而a[1]这个对象还在内存中,事实证明,他果然还在。

所以 如果是 new 一个对象的话,可以用delete来释放内存 如果是new 一个数组的话,就要delete[] 才能清除干净。